﻿// 359 创世纪.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>


using namespace std;


/*


https://www.acwing.com/problem/content/361/

上帝手中有 N 种世界元素，每种元素可以限制另外 1 种元素，把第 i 种世界元素能够限制的那种世界元素记为 A[i]。

现在，上帝要把它们中的一部分投放到一个新的空间中去建造世界。

为了世界的和平与安宁，上帝希望所有被投放的世界元素都有至少一个没有被投放的世界元素限制它。

上帝希望知道，在此前提下，他最多可以投放多少种世界元素？

输入格式
第一行是一个整数 N，表示世界元素的数目。

第二行有 N 个整数 A[1],A[2],…,A[N]。A[i] 表示第 i 个世界元素能够限制的世界元素的编号。

输出格式
一个整数，表示最多可以投放的世界元素的数目。

数据范围
N≤106,1≤A[i]≤N
输入样例：
6
2 3 1 3 6 5
输出样例：
3
*/

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1000010, INF = 1e8;

int n;
int h[N], e[N], rm[N], ne[N], idx;
int f1[N][2], f2[N][2];
bool st[N], ins[N];
int ans;

void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

void dfs_f(int u, int ap, int f[][2])
{
    for (int i = h[u]; ~i; i = ne[i])
    {
        if (rm[i]) continue;
        int j = e[i];
        dfs_f(j, ap, f);
        f[u][0] += max(f[j][0], f[j][1]);
    }
    if (u == ap) f[u][1] = f[u][0] + 1, f[u][0] = -INF;
    else
    {
        f[u][1] = -INF;
        for (int i = h[u]; ~i; i = ne[i])
        {
            if (rm[i]) continue;
            int j = e[i];
            f[u][1] = max(f[u][1], f[u][0] - max(f[j][0], f[j][1]) + f[j][0] + 1);
        }
    }
}

void dfs_c(int u, int from)
{
    st[u] = ins[u] = true;
    for (int i = h[u]; ~i; i = ne[i])
    {
        int j = e[i];
        if (!st[j]) dfs_c(j, i);
        else if (ins[j])
        {
            rm[i] = 1;
            dfs_f(j, -1, f1);
            dfs_f(j, u, f2);
            ans += max(max(f1[j][0], f1[j][1]), f2[j][0]);
        }
    }

    ins[u] = false;
}

int main()
{
    scanf("%d", &n);
    memset(h, -1, sizeof h);
    for (int i = 1; i <= n; i++)
    {
        int a;
        scanf("%d", &a);
        add(a, i);
    }

    for (int i = 1; i <= n; i++)
        if (!st[i])
            dfs_c(i, -1);

    printf("%d\n", ans);
    return 0;
}

